package com.jwt.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SignatureException;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class NewJwtUtil {

    /**
     * 生成JWT
     * @param subject 主题
     * @param ttlMillis 有效期（毫秒）
     * @param claims 自定义声明
     * @param secret 密钥字符串
     * @return JWT字符串
     */
    public static String generateToken(String subject, long ttlMillis, Map<String, Object> claims, String secret) {
        // 将密钥字符串转换为安全密钥对象
        SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());

        // 计算过期时间
        long nowMillis = System.currentTimeMillis();
        Date expDate = new Date(nowMillis + ttlMillis);

        // 构建JWT
        return Jwts.builder()
                .subject(subject)
                .issuedAt(new Date(nowMillis))
                .expiration(expDate)
                .claims(claims)
                .signWith(key)
                .compact();
    }

    /**
     * 解析JWT
     * @param token JWT字符串
     * @param secret 密钥字符串
     * @return 声明集合
     */
    public static Claims parseToken(String token, String secret) {
        SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());

        return Jwts.parser()
                .verifyWith(key)
                .build()
                .parseSignedClaims(token)
                .getPayload();
    }

    /**
     * 验证JWT是否有效
     * @param token JWT字符串
     * @param secret 密钥字符串
     * @return 是否有效
     */
    public static boolean validateToken(String token, String secret) {
        try {
            parseToken(token, secret);
            return true;
        } catch (ExpiredJwtException e) {
            // Token已过期
            System.err.println("Token expired: " + e.getMessage());
        } catch (SignatureException e) {
            // 签名验证失败
            System.err.println("Invalid signature: " + e.getMessage());
        } catch (Exception e) {
            // 其他解析异常
            System.err.println("Invalid token: " + e.getMessage());
        }
        return false;
    }

    public static void main(String[] args) {
        // 示例用法
        String secret = "mySecretKey1234567890abcdefghijklmnopqrstuvwxyz";

        // 自定义声明
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", 123);
        claims.put("role", "admin");

        // 生成token
        String token = generateToken("testUser", 3600000, claims, secret);
        System.out.println("Generated Token: " + token);

        // 验证并解析token
        if (validateToken(token, secret)) {
            Claims parsedClaims = parseToken(token, secret);
            System.out.println("Subject: " + parsedClaims.getSubject());
            System.out.println("UserID: " + parsedClaims.get("userId"));
            System.out.println("Expiration: " + parsedClaims.getExpiration());
        }
    }
}